home *** CD-ROM | disk | FTP | other *** search
/ isnet Internet / Isnet Internet CD.iso / prog / hiz / 09 / 09.exe / adynware.exe / perl / lib / dotsh.pl < prev    next >
Encoding:
Text File  |  1999-12-28  |  1.2 KB  |  42 lines

  1. sub dotsh {
  2.    local(@sh) = @_;
  3.    local($tmp,$key,$shell,*dotsh,$command,$args,$vars) = '';
  4.    $dotsh = shift(@sh);
  5.    @dotsh = split (/\s/, $dotsh);
  6.    $command = shift (@dotsh);
  7.    $args = join (" ", @dotsh);
  8.    $vars = join ("\n", @sh);
  9.    open (_SH_ENV, "$command") || die "Could not open $dotsh!\n";
  10.    chop($_ = <_SH_ENV>);
  11.    $shell = "$1 -c" if ($_ =~ /^\#\!\s*(\S+(\/sh|\/ksh|\/zsh|\/csh))\s*$/);
  12.    close (_SH_ENV);
  13.    if (!$shell) {
  14.       if ($ENV{'SHELL'} =~ /\/sh$|\/ksh$|\/zsh$|\/csh$/) {
  15.      $shell = "$ENV{'SHELL'} -c";
  16.       } else {
  17.      print "SHELL not recognized!\nUsing /bin/sh...\n";
  18.      $shell = "/bin/sh -c";
  19.       }
  20.    }
  21.    if (length($vars) > 0) {
  22.       system "$shell \"$vars;. $command $args; set > /tmp/_sh_env$$\"";
  23.    } else {
  24.       system "$shell \". $command $args; set > /tmp/_sh_env$$\"";
  25.    }
  26.  
  27.    open (_SH_ENV, "/tmp/_sh_env$$") || die "Could not open /tmp/_sh_env$$!\n";
  28.    while (<_SH_ENV>) {
  29.        chop;
  30.        m/^([^=]*)=(.*)/s;
  31.        $ENV{$1} = $2;
  32.    }
  33.    close (_SH_ENV);
  34.    system "rm -f /tmp/_sh_env$$";
  35.  
  36.    foreach $key (keys(%ENV)) {
  37.        $tmp .= "\$$key = \$ENV{'$key'};" if $key =~ /^[A-Za-z]\w*$/;
  38.    }
  39.    eval $tmp;
  40. }
  41. 1;
  42.